home *** CD-ROM | disk | FTP | other *** search
/ Day Cry / Day Cry CD.bin / oh_towns / tetujin / src.lzh / G_EFF / MEDFLT.C < prev    next >
Text File  |  1994-06-05  |  2KB  |  140 lines

  1. /*
  2.         graphic effect lib.
  3.           Noise Filter
  4.  
  5.         h. Toda 1994 5 9
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <egb.h>
  11. #include "g_eff.h"
  12.  
  13. #define NOERR 0        /* no error */
  14.  
  15. static int mx ;
  16. static int aSen ;
  17. static int mSen ;
  18. static int cMax ;
  19. static int aMax ;
  20. static int x1 ;
  21. static int y1 ;
  22. static int x2 ;
  23. static int y2 ;
  24. static int (*read1)() ;
  25. static int (*write)() ;
  26. static int (*mask)() ;
  27.  
  28. g_medianFilter( BASICPARA *para )
  29. {
  30.     unsigned char a[10][4] ;
  31.     int i, x, y ;
  32.     int n ;
  33.  
  34.     mx = para->mix ;
  35.     aSen = para->alphaSen ;
  36.     mSen = para->maskSen ;
  37.     cMax = para->colorMax ;
  38.     aMax = para->alphaMax ;
  39.     x1 = para->lupx ;
  40.     y1 = para->lupy ;
  41.     x2 = para->rdwx ;
  42.     y2 = para->rdwy ;
  43.     read1 = para->read1 ;
  44.     write = para->write ;
  45.     mask = para->mask ;
  46.  
  47.     for( y = y1 ; y <= y2 ; y++ )
  48.     {
  49.         for( x=x1 ; x <= x2 ; x++ )
  50.         {
  51.             read1( x-1, y-1, a[0] ) ;
  52.             read1( x,   y-1, a[1] ) ;
  53.             read1( x+1, y-1, a[2] ) ;
  54.             read1( x-1, y,   a[3] ) ;
  55.             read1( x,   y,   a[4] ) ;
  56.             read1( x+1, y,   a[5] ) ;
  57.             read1( x-1, y+1, a[6] ) ;
  58.             read1( x,   y+1, a[7] ) ;
  59.             read1( x+1, y+1, a[8] ) ;
  60.  
  61.             for( i=0 ; i<3 ; i++ )
  62.             {
  63.                 n = ck9(
  64.                          a[0][i], a[1][i], a[2][i],
  65.                          a[3][i], a[4][i], a[5][i],
  66.                          a[6][i], a[7][i], a[8][i]
  67.                        ) ;
  68.                 a[9][i] = a[n][i] ;
  69.             }
  70.             mixWrite( x, y, a[9], a[4] ) ;
  71.         }
  72.     }
  73.  
  74.     return NOERR ;
  75. }
  76.  
  77. static mixWrite( int x, int y, unsigned char *a, unsigned char *b )
  78. {
  79.     unsigned char c[4] ;
  80.     int mix ;
  81.  
  82.     if( mSen )
  83.     {
  84.         if( mask( x, y ) >= mSen )
  85.             return NOERR ;
  86.     }
  87.  
  88.     mix = mx ;
  89.     if( aSen )
  90.     {
  91.         mix = mix * b[3] / aMax ;
  92.     }
  93.  
  94.     c[0] = ( a[0] * mix + b[0] * ( 256 - mix ) + 0x80 ) >> 8 ;
  95.     c[1] = ( a[1] * mix + b[1] * ( 256 - mix ) + 0x80 ) >> 8 ;
  96.     c[2] = ( a[2] * mix + b[2] * ( 256 - mix ) + 0x80 ) >> 8 ;
  97.     c[3] = b[3] ;
  98.  
  99.     if( mix )
  100.     {
  101.         write( x, y, c ) ;
  102.     }
  103.  
  104.     return NOERR ;
  105. }
  106.  
  107. static ck9( int a0, int a1, int a2, int a3,
  108.             int a4, int a5, int a6, int a7, int a8 )
  109. {
  110.     int temp ;
  111.     int m[9] ;
  112.     int a[9] ;
  113.     int i, j ;
  114.  
  115.     for( i=0 ; i<9 ; i++ )m[i] = i ;
  116.  
  117.     a[0] = a0 ; a[1] = a1 ; a[2] = a2 ; a[3] = a3 ; a[4] = a4 ;
  118.     a[5] = a5 ; a[6] = a6 ; a[7] = a7 ; a[8] = a8 ;
  119.  
  120.     for( j=1 ; j<6 ; j++ )
  121.     {
  122.         for( i=j ; i<9 ; i++ )
  123.         {
  124.             if( a[j-1] > a[i] )
  125.             {
  126.                 temp = a[i] ;
  127.                 a[i] = a[j-1] ;
  128.                 a[j-1] =temp ;
  129.  
  130.                 temp = m[i] ;
  131.                 m[i] = m[j-1] ;
  132.                 m[j-1] =temp ;
  133.             }
  134.         }
  135.     }
  136.  
  137.     return m[4] ;
  138. }
  139.  
  140.